import { defineConfig, loadEnv } from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path'; // 路径别名配置
import legacy from '@vitejs/plugin-legacy';
import viteCompression from 'vite-plugin-compression'; // gzip 压缩插件
import { createSvgIconsPlugin, ViteSvgIconsPlugin } from 'vite-plugin-svg-icons'; // 加载本地svg文件插件

export default ({ mode }) => {
  const env = loadEnv(mode, process.cwd());
  const svgOption: ViteSvgIconsPlugin = {
    iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], // 指定需要缓存的图标文件夹(路径为存放所有svg图标的文件夹不单个svg图标)
    symbolId: 'icon-[dir]-[name]', // 指定symbolId格式
    svgoOptions: true, // 是否压缩svg
  };
  return defineConfig({
    build: {
      outDir: 'dist',
      // chunkSizeWarningLimit: 1500, // 大文件报警阀值，不建议使用
      emptyOutDir: true,
      cssCodeSplit: false, //css 拆分
      sourcemap: false, //不生成sourcemap// 这个生产环境一定要关闭，不然打包的产物会很大
      reportCompressedSize: false, //   关闭文件计算
      minify: 'terser', //是否禁用最小化混淆，esbuild打包速度最快，terser打包体积最小。
      assetsInlineLimit: 5000, //小于该值 图片将打包成Base64
      terserOptions: {
        compress: {
          //生产环境时移除console
          drop_console: true,
          drop_debugger: true,
        },
      },
      rollupOptions: {
        output: {
          chunkFileNames: 'static/js/[name]-[hash:8].js', // 引入文件名的名称
          entryFileNames: 'static/js/[name]-[hash:8].js', // 包的入口文件名称
          assetFileNames: 'static/[ext]/[name]-[hash:8].[ext]', // 资源文件像 字体，图片等
          manualChunks(id) {
            if (id.includes('node_modules')) {
              return id.toString().split('node_modules/')[1].split('/')[0].toString();
            }
          },
        },
      },
    },
    //这里进行配置别名
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: '@import "@/assets/styles/mixin.scss";',
        },
      },
    },
    // 全局css配置
    plugins: [
      vue(),
      legacy({
        targets: ['chrome 52'], // 需要兼容的目标列表，可以设置多个
        additionalLegacyPolyfills: ['regenerator-runtime/runtime'], // 面向IE11时需要此插件
      }),
      createSvgIconsPlugin(svgOption),
      viteCompression({
        algorithm: 'gzip', // 指定压缩算法为gzip,[ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
        threshold: 10240, // 仅对文件大小大于threshold的文件进行压缩，默认为10KB
        deleteOriginFile: false, // 是否删除原始文件，默认为false
        filter: /\.(js|css|json|html|ico|svg)(\?.*)?$/i, // 匹配要压缩的文件的正则表达式，默认为匹配.js、.css、.json、.html、.ico和.svg文件
        compressionOptions: { level: 9 }, // 指定gzip压缩级别，默认为9（最高级别）
        verbose: true, //是否在控制台输出压缩结果
        disable: false, //是否禁用插件
        ext: '.gz', //文件后缀
      }),
    ],
    // 编译设置
    resolve: {
      alias: {
        '@': path.resolve('./src'), // @代替src
        '#': path.resolve('./types'), // #代替types
      },
    },
    // 相关插件配置
    server: {
      host: '0.0.0.0',
      port: 8080,
      open: true,
      hmr: {
        overlay: true,
      },
      proxy: {
        '/api': {
          target: env.VITE_BASE_URL,
          changeOrigin: true,
          ws: true,
          rewrite: (path: string) => path.replace(/^\/api/, ''),
        },
      },
    },
  });
};
